const express = require('express');
const router = express.Router();
const multer = require('multer');
const xlsx = require('xlsx');
const cors = require('cors');
const path = require('path');
const fs = require('fs');
const db = require('../config/db');
const { getLocalTime, getRandom4DigitNumber} = require('../utils/utils');



// 确保上传目录存在
const uploadDir = 'uploads/';
if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
}

// 文件上传配置
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, uploadDir);
    },
    filename: (req, file, cb) => {
        const ext = path.extname(file.originalname);
        cb(null, `${Date.now()}${ext}`);
    }
});

const upload = multer({
    storage: storage,
    limits: { fileSize: 10 * 1024 * 1024 }, // 10MB限制
    fileFilter: (req, file, cb) => {
        const allowedTypes = [
            'application/vnd.ms-excel',
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        ];

        if (allowedTypes.includes(file.mimetype)) {
            cb(null, true);
        } else {
            cb(new Error('只允许上传Excel文件(.xls, .xlsx)'));
        }
    }
});



// 批量上传数据接口
router.post('/import' , upload.single('file'), async (req, res) => {
    try {
        if (!req.file) {
            return res.status(400).json({
                success: false,
                message: '请上传文件'
            });
        }
        const isCover = req.body.isCover === 'true'; // 是否覆盖数据

        // 1. 读取Excel文件
        const workbook = xlsx.readFile(req.file.path);
        const firstSheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[firstSheetName];
        // 2. 转换为JSON数据
        const data = xlsx.utils.sheet_to_json(worksheet);
        if (data.length === 0) {
            return res.json({
                code: 500,
                success: false,
                msg: 'Excel文件中没有数据'
            });
        }

        // 3. 验证数据格式
        const validationResult = validateData(data);
        if (!validationResult.valid) {
            return res.status(400).json({
                success: false,
                message: '数据格式验证失败',
                errors: validationResult.errors
            });
        }
        // 4. 处理数据 (根据业务需求实现)
        const importResult = await processImportData(data, isCover);

        // 5. 删除临时文件
        fs.unlinkSync(req.file.path);

        res.json({
            code: 200,
            msg: "成功333",
            data: {
                total: data.length,
                success: importResult.successCount,
                failure: importResult.failureCount,
                errors: importResult.errors
            }
        });
    } catch (error) {
        res.status(500).json({ message: '下载模版失败', error });
    }
});


async function getUniqueRandom4DigitNumber(db, maxAttempts = 100) {
    let attempts = 0;

    while (attempts < maxAttempts) {
        const genderValue = getRandom4DigitNumber();

        // const genderValue = 5352;
        const [rows] = await db.query('SELECT * FROM changbaoshang WHERE genderValue = ?', [genderValue]);

        if (rows.length === 0) {
            return genderValue;
        }
        attempts++;
    }

    throw new Error(`无法在${maxAttempts}次尝试内找到唯一的4位随机数`);
}


// 批量上传数据接口
router.post('/importgong' , upload.single('file'), async (req, res) => {
    try {
        if (!req.file) {
            return res.status(400).json({
                success: false,
                message: '请上传文件'
            });
        }
        const isCover = req.body.isCover === 'true'; // 是否覆盖数据

        // 1. 读取Excel文件
        const workbook = xlsx.readFile(req.file.path);
        const firstSheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[firstSheetName];
        // 2. 转换为JSON数据
        const data = xlsx.utils.sheet_to_json(worksheet);
        if (data.length === 0) {
            return res.json({
                code: 500,
                success: false,
                msg: 'Excel文件中没有数据'
            });
        }

        // // 3. 验证数据格式
        // const validationResult = validateData(data);
        // if (!validationResult.valid) {
        //     return res.status(400).json({
        //         success: false,
        //         message: '数据格式验证失败',
        //         errors: validationResult.errors
        //     });
        // }
        // 4. 处理数据 (根据业务需求实现)
        const importResult = await processImportDatagong(data, isCover);

        // 5. 删除临时文件
        fs.unlinkSync(req.file.path);

        res.json({
            code: 200,
            msg: "成功333",
            data: {
                total: data.length,
                success: importResult.successCount,
                failure: importResult.failureCount,
                errors: importResult.errors
            }
        });
    } catch (error) {
        res.status(500).json({ message: '下载模版失败', error });
    }
});





// 数据验证函数
function validateData(data) {
    const errors = [];
    let isValid = true;

    data.forEach((row, index) => {
        // 示例验证规则 - 根据实际业务调整
        if (!row.合同编号) {
            errors.push(`第${index + 2}行: 合同编号不能为空`);
            isValid = false;
        }

        if (row.合同金额 && isNaN(parseFloat(row.合同金额))) {
            errors.push(`第${index + 2}行: 合同金额必须是数字`);
            isValid = false;
        }

        // 添加更多验证规则...
    });

    return { valid: isValid, errors };
}

// 数据处理函数 (模拟)
async function processImportData(data, isCover) {
    const result = {
        successCount: 0,
        failureCount: 0,
        errors: []
    };

    // 如果是覆盖模式，先清空原有数据
    if (isCover) {
        try {
            await db.query('TRUNCATE TABLE lista');
        } catch (error) {
            console.error('清空数据失败:', error);
            result.errors.push({
                row: 0,
                message: '清空现有数据失败'
            });
            return result;
        }
    }

    // 模拟数据处理 - 实际项目中替换为数据库操作
    for (let i = 0; i < data.length; i++) {
        const row = data[i];
        const rowNumber = i + 2; // Excel行号(从1开始) + 表头行
        try {
            // 字段映射 (根据Excel列名到数据库字段)
            const record = {
                username: row['合同编号'] || '',  // 合同编号 → username
                gender: row['承包商'] || '',      // 承包商 → gender
                kaihuname: row['开户行'] || '',  // 开户行 → kaihuStut
                backname: row['银行账号'] || '',    // 银行账号 → email
                hetongjine: row['合同金额'],     // 合同金额 → hetongjine
                fukuanzonge: row['付款总额'],    // 付款总额 → fukuanzonge
                createTime: row['创建时间'] || getLocalTime()
            };
            // 验证必填字段
            if (!record.username) {
                throw new Error('合同编号不能为空');
            }

            // 验证金额是否为数字
            if (isNaN(parseFloat(record.hetongjine))){
                throw new Error('合同金额必须是有效数字');
            }

            if (isNaN(parseFloat(record.fukuanzonge))){
                throw new Error('付款总额必须是有效数字');
            }
            // 验证金额是否为数字
            if (isNaN(parseFloat(record.gender))){
                throw new Error('承包商必须是有效数字编号，请在承包商编号中查看');
            }
            // 格式化金额
            record.hetongjine = formatAmount(record.hetongjine);
            record.fukuanzonge = formatAmount(record.fukuanzonge);
            await db.query(
                'INSERT INTO lista (username, gender, kaihuname, backname, hetongjine, fukuanzonge, createTime) VALUES (?, ?, ?, ?, ?, ?, ?)',
                [
                    record.username,
                    record.gender,
                    record.kaihuname,
                    record.backname,
                    record.hetongjine,
                    record.fukuanzonge,
                    record.createTime
                ]
            );


            result.successCount++;
        } catch (error) {
            result.failureCount++;
            result.errors.push({
                row: rowNumber,
                message: error.message
            });

            // 继续处理下一行而不是中断
            continue;
        }
    }

    return result;
}

// 数据处理函数 (模拟)
async function processImportDatagong(data, isCover) {
    const result = {
        successCount: 0,
        failureCount: 0,
        errors: []
    };

    // 如果是覆盖模式，先清空原有数据
    if (isCover) {
        try {
            await db.query('TRUNCATE TABLE changbaoshang');
        } catch (error) {
            console.error('清空数据失败:', error);
            result.errors.push({
                row: 0,
                message: '清空现有数据失败'
            });
            return result;
        }
    }
    // 模拟数据处理 - 实际项目中替换为数据库操作
    for (let i = 0; i < data.length; i++) {
        const row = data[i];
        const rowNumber = i + 2; // Excel行号(从1开始) + 表头行
        try {
            const weiRound =  await  getUniqueRandom4DigitNumber(db)

            // 字段映射 (根据Excel列名到数据库字段)
            const record = {
                genderLabel: row['供应商名称'] || '',  // 供应商名称 → username
                kaihuname: row['开户行'] || '',      // 开户行 → gender
                backname: row['银行账号'] || '',  // 银行账号 → kaihuStut
                genderValue: weiRound,    // 编号
                createTime: row['创建时间'] || getLocalTime()
            };
            // 验证金额是否为数字
            if (isNaN(parseFloat(record.genderValue))){
                throw new Error('承包商必须是有效数字编号，请在承包商编号中查看');
            }
            await db.query(
                'INSERT INTO changbaoshang (genderLabel, genderValue, kaihuname,backname, createTime) VALUES (?, ?, ?, ?, ?)',
                [
                    record.genderLabel,
                    record.genderValue,
                    record.kaihuname,
                    record.backname,
                    record.createTime
                ]
            );


            result.successCount++;
        } catch (error) {
            result.failureCount++;
            result.errors.push({
                row: rowNumber,
                message: error.message
            });

            // 继续处理下一行而不是中断
            continue;
        }
    }

    return result;
}



function formatAmount(input) {
    // 2. 转换为数字（处理字符串输入）
    const num = Number(input);

    // 3. 格式化为 2 位小数
    return num.toFixed(2);
}

// 模版下载
router.post('/export', async (req, res) => {
    try {
        // 1. 创建模板工作簿
        const workbook = xlsx.utils.book_new();

        // 2. 定义表头和数据
        const headers = ['合同编号', '承包商', '开户行', '银行账号', '合同金额', '付款总额', '创建时间'];
        const demoData = [
            {
                '合同编号': 'ME-PO-202506-0604AB',
                '承包商': '承包商A',
                '开户行': '开户行A',
                '银行账号': '1234 5678 9012 3456',
                '合同金额': '10000.00',
                '付款总额': '10000.00',
                '创建时间': '2023-01-01'
            },
            {
                '合同编号': 'ME-PO-202506-0604AB',
                '承包商': '承包商A',
                '开户行': '开户行A',
                '银行账号': '1234 5678 9012 3456',
                '合同金额': '10000.00',
                '付款总额': '10000.00',
                '创建时间': '2023-01-01'
            }
        ];

        // 3. 创建工作表
        const worksheet = xlsx.utils.json_to_sheet(demoData, { header: headers });
        xlsx.utils.book_append_sheet(workbook, worksheet, '模板');

        // 4. 生成Excel文件
        const buffer = xlsx.write(workbook, { type: 'buffer', bookType: 'xlsx' });

        // 5. 设置响应头 - 修复文件名编码问题
        const filename = encodeURIComponent('合同模板.xlsx'); // 对文件名进行编码
        res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${filename}`);

        // 6. 发送文件
        res.send(buffer);

    } catch (error) {
        console.error('模板下载失败:', error);
        res.status(500).json({
            success: false,
            message: '模板下载失败'
        });
    }
});



// 模版下载
router.post('/exporthezuo', async (req, res) => {
    try {
        // 1. 创建模板工作簿
        const workbook = xlsx.utils.book_new();

        // 2. 定义表头和数据
        const headers = ['供应商名称', '开户行', '银行账号'];
        const demoData = [
            {
                '供应商名称': '上海兴源东安电气设备制造有限公司',
                '开户行': '建行上海朱泾支行',
                '银行账号': '3100 1939 3000 5000 8151'
            },
            {
                '供应商名称': '美登思能源技术（上海）有限公司',
                '开户行': '招商银行股份有限公司上海自贸试验区临港新片区支行',
                '银行账号': '121941015510918'
            }
        ];

        // 3. 创建工作表
        const worksheet = xlsx.utils.json_to_sheet(demoData, { header: headers });
        xlsx.utils.book_append_sheet(workbook, worksheet, '模板');

        // 4. 生成Excel文件
        const buffer = xlsx.write(workbook, { type: 'buffer', bookType: 'xlsx' });

        // 5. 设置响应头 - 修复文件名编码问题
        const filename = encodeURIComponent('合同模板.xlsx'); // 对文件名进行编码
        res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${filename}`);

        // 6. 发送文件
        res.send(buffer);

    } catch (error) {
        console.error('模板下载失败:', error);
        res.status(500).json({
            success: false,
            message: '模板下载失败'
        });
    }
});




module.exports = router;